package org.jiamandan.com.strategy.impl.car.listener;

import cn.hutool.core.date.DateUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.jiamandan.com.constant.YxConstant;
import org.jiamandan.com.dto.YXBasicDto;
import org.jiamandan.com.entity.RechargePile;
import org.jiamandan.com.service.IRechargePileService;
import org.jiamandan.com.strategy.impl.car.IYXContextListener;
import org.jiamandan.com.utils.CommonUtil;
import org.jiamandan.com.utils.YxObjectUtil;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @version Revision 1.0.1
 * @版权：版权所有 (c) 2021
 * @author:Lee
 * @email:honvy.lee@qq.com
 * @see:
 * @创建日期：2023-03-21 10:32
 * @功能说明：充电桩登录认证 帧类型码 帧类型码名称 数据传送方向 备注
 * 0x01 充电桩登录认证 充电桩->运营平台 充电桩每次复位或通信
 * 离线，都需重新登录,并
 * 成功后才能进行后续交互
 * @begin
 * @修改记录:
 * @修改后版本 修改人        修改内容
 * @2023-03-21 10:32	         Lee        	创建
 * @end
 */
@Service(value = YxConstant.Service.CMD_1)
@AllArgsConstructor
@Slf4j
public class YxLoginListener implements IYXContextListener {

    /**
     * 1 桩编码 BCD 码 7 不足 7 位补 0
     * 2 桩类型 BIN 码 1 0 表示直流桩，1 表示交流桩
     * 3 充电枪数量 BIN 码 1
     * 4 通信协议版本 BIN 码 1 版本号乘 10，v1.0 表示 0x0A
     * 5 程序版本 ASCII 码 8 不足 8 位补零
     * 6 网络链接类型 BIN 码 1 0x00 SIM 卡
     * 0x01 LAN
     * 0x02 WAN
     * 0x03 其他
     * 7 Sim 卡 BCD 码 10 不足 10 位补零，取不到置零
     * 8 运营商 BIN 码 1 0x00 移动
     * 0x02 电信
     * 0x03 联通
     * 0x04 其他
     */
    private static final int[] number = {14, 2, 2, 2, 16, 2, 20, 2};
    private IRechargePileService iRechargePileService;

    @Override
    public void doExecute(YXBasicDto dto, Channel client) throws Exception {
        log.info("接收JMD-YX登录认证(CMD = 01)：" + dto);
        String pileNo = StringUtils.substring(dto.getData(), 0, number[0]);
        String realPileNo = StringUtils.substring(dto.getData(), 0, number[0]);
        int pileNum = 1;//TODO 获取设备是双枪还是单枪
        /**
         * 68（起始标志）0C（数据长度）0000（序列号域）00（加密标志）02（类型）55 03 14 12 78 23
         * 05（桩编码）00（登陆结果：成功）DA 4C（帧校验域）
         */
        StringBuilder builder = new StringBuilder(pileNo);
        builder.append(pileNum > 0 ? "00" : "01");
        String replyMsg = YxObjectUtil.replyMessage(builder.toString(), dto.getSequence(), YxConstant.Cmd.CMD_2);
        log.info("JMD-YX【" + pileNo + "】登录认证应答(CMD = 02)：" + replyMsg);
        ByteBuf buf = Unpooled.buffer(replyMsg.getBytes().length);
        buf.writeBytes(CommonUtil.hexToByteArray(replyMsg));
        ChannelFuture future = client.writeAndFlush(buf);
        ///登录后下发对时
        if (pileNum > 0) {
            StringBuilder builder1 = new StringBuilder();
            builder1.append(StringUtils.leftPad(pileNo, 14, "0"));
            Date time = DateUtil.date();
            builder1.append(YxObjectUtil.getTime2CP56time2a(time));
            String timeReplyMsg = YxObjectUtil.pushMessage(builder1.toString(), YxConstant.Cmd.CMD_56);
            log.info("JMD-YX【" + pileNo + "下发时间" + DateUtil.formatDateTime(time) + "】对时下发(CMD = 56)：" + timeReplyMsg);
            ByteBuf buf1 = Unpooled.buffer(timeReplyMsg.getBytes().length);
            buf1.writeBytes(CommonUtil.hexToByteArray(timeReplyMsg));
            client.writeAndFlush(buf1);
        }
    }
}
